/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package interfaces;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.WritableRaster;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import auxiliar.Filtros;

/**
 *
 * @author wolgrand
 */
    class MeuJPanel extends JPanel{

        //private String nome;
        private BufferedImage imagem;
        private JLabel barraDeEstado;
        private int estado;
        private int numeroDePontos;
        private int[][] pontos;
        private int[] angulos;
        private int posicao;

        //carrega a imagem
        public MeuJPanel(String nome) {

            try {
                imagem = ImageIO.read(new File(nome));
                barraDeEstado = new JLabel("");
                add(barraDeEstado,BorderLayout.SOUTH);
                addMouseListener(new OuvidorDeMouseClicado());
                estado = 0;
                numeroDePontos = 0;
                posicao = 0;
            } catch (Exception e) {
                System.err.print("Erro ao abrir o arquivo");
                e.printStackTrace();
            }
        }

        public MeuJPanel(BufferedImage imagem){

            this.imagem =  imagem;
            addMouseListener(new OuvidorDeMouseClicado());
            barraDeEstado = new JLabel("");
            estado = 0;
            numeroDePontos = 0;
            posicao = 0;
        }

        public BufferedImage getImagem(){

            return this.imagem;
        }

        public void setImagem(BufferedImage imagem){

            this.imagem = imagem;
        }

        //exibe imageIcon no painel
        public void paintComponent(Graphics g){

            super.paintComponent(g);
            ImageIcon icon = new ImageIcon(imagem);
            icon.paintIcon(this, g, 0, 0);
        }

        //retorna as dimensões da imagem
        public Dimension getPreferredSize(){

           return new Dimension(imagem.getWidth(),imagem.getHeight());
        }

        /**
         * @return the estado
         */
        public int getEstado() {
            return estado;
        }

        /**
         * @param estado the estado to set
         */
        public void setEstado(int estado) {
            this.estado = estado;
        }

        /**
         * @return the numeroDePontos
         */
        public int getNumeroDePontos() {
            return numeroDePontos;
        }

        /**
         * @param numeroDePontos the numeroDePontos to set
         */
        public void setNumeroDePontos(int numeroDePontos) {
            System.out.println("Iniciei..., Numero De Pontos: "+numeroDePontos);
            this.numeroDePontos = numeroDePontos;
            this.pontos = new int[numeroDePontos][2];
            this.angulos = new int[numeroDePontos];
            this.posicao = 0;
            barraDeEstado.setText("0 pontos selecionados de "+numeroDePontos+".");
        }

        /**
         * @return the pontos
         */
        public int[][] getPontos() {
            return pontos;
        }

        /**
         * @return the posicao
         */
        public int getPosicao() {
            return posicao;
        }

        /**
         * @param posicao the posicao to set
         */
        public void setPosicao(int posicao) {
            this.posicao = posicao;
        }

        
       

        //Classe interna para tratar eventos do mouse
        private class OuvidorDeMouseClicado extends MouseAdapter{
        
            //trata evento de clique de mouse e determina qual botão foi pressionado
            public void mouseClicked(MouseEvent event){

                System.out.println("okokokokok");

               if((posicao <= numeroDePontos) && (estado == 1) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
		        Filtros.DeformacaoPorRotacao(imagem, pontos,angulos);
                        
                        estado = 0;
                    }
               }
               if((posicao <= numeroDePontos) && (estado == 2) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
                        String aux1 = JOptionPane.showInputDialog("Digite o valor de m: "+(posicao+1)+":");
		        Filtros.DeformacaoPorRotacaoLinear(imagem, pontos,angulos,Double.parseDouble(aux1));

                        estado = 0;
                    }
               }
               if((posicao <= numeroDePontos) && (estado == 3) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
		        Filtros.DeformacaoPorRotacaoBordas(imagem, pontos,angulos);

                        estado = 0;
                    }
               }
               if((posicao <= numeroDePontos) && (estado == 4) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
                        String aux2 = JOptionPane.showInputDialog("Digite o valor de m:");
		        Filtros.DeformacaoPorRotacaoBordasLinear(imagem, pontos,angulos,Double.parseDouble(aux2));

                        estado = 0;
                    }
               }
               if((posicao <= numeroDePontos) && (estado == 5) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
                        String aux2 = JOptionPane.showInputDialog("Digite o valor de m:");
		        Filtros.DeformacaoPorRotacaoLinearMR(imagem, pontos, angulos,Double.parseDouble(aux2));

                        estado = 0;
                    }
               }
                if((posicao <= numeroDePontos) && (estado == 6) && (event.isMetaDown())){
                    pontos[posicao][0] = event.getX();
                    pontos[posicao][1] = event.getY();
                    String con = JOptionPane.showInputDialog("Digite o valor do ângulo para o centro de rotação "+(posicao+1)+":");
                    angulos[posicao] = Integer.parseInt(con);
                    posicao++;
                    barraDeEstado.setText(posicao+" pontos selecionados de "+numeroDePontos+".");
                    if(posicao == numeroDePontos ){
                        barraDeEstado.setText("");
		        Filtros.DeformacaoPorRotacaoRM(imagem, pontos, angulos);

                        estado = 0;
                    }
                }
            }

        }

    }//fim da classe
